// DataLibrary FunctionPlugin - Scroll

// 識別子：DL
// 内容  ：スクロール制御。

//----------------------------------------------------------------------------//
// Plugin
//----------------------------------------------------------------------------//

//-- プラグインの読み込み処理 --//
//DL_LoadFunction_Scroll:
//Return


//-- プラグインの終了処理 --//
DL_UnloadFunction_Scroll:
	UnSet DL_ScrollData
Return


//----------------------------------------------------------------------------//
// ScrollControl
//----------------------------------------------------------------------------//

//-- SetScrollData id mode display_num item_num [default_pos] : ページ操作用の情報を設定する --//
DL_SetScrollData:
	Local id = Args(1)           // 識別用のID
	Local mode = LCase(Args(2))  // スクロールモード
	Local display_num = Args(3)  // 表示数
	Local item_num = Args(4)     // 総数
	Local default_pos = Args(5)  // 初期表示位置
	
	// 最大表示位置を設定する
	Switch mode
	Case "page" "pageb"
		Local max_page = RoundUp(item_num / display_num)
		Local max_pos = (max_page * display_num) - (display_num - 1)
		mode = IIf(mode = "pageb", "PageB", "Page")
	Case "line" "lineb"
		Local max_pos = Max(item_num - display_num + 1, 1)
		mode = IIf(mode = "lineb", "LineB", "Line")
	Case "delete"
		UnSet DL_ScrollData[id]
		Return
	Case Else
		Return  // モードが指定されていないので終了する
	EndSw
	
	// 初期表示位置を設定する
	Local now_pos = 1
	If default_pos > 0 Then
		If mode Like "Page*" Then
			now_pos = Min((default_pos - 1) * display_num + 1, max_pos)
		Else
			now_pos = Min(default_pos, max_pos)
		EndIf
	ElseIf IsVarDefined(DL_ScrollData[id]) Then
		Return  // 初期表示位置が指定されておらず、同じIDがすでに設定されている場合は終了する
	EndIf
	
	//  ページ操作用データ List(現在表示位置, 最大表示位置, 表示数, 総数)
	Set DL_ScrollData[id] List(now_pos, max_pos, display_num, item_num, mode)
Return


//-- GetScrollData(id, data_name) : 指定したページ操作用データを返す --//
DL_GetScrollData:
	Local data = DL_ScrollData[Args(1)]
	If data = "" Then
		Return ""  // データが存在しない場合は終了する
	EndIf
	
	// 記録情報を返す
	Local data_idx = LSearch("nowpos maxpos displaynum itemnum mode", LCase(Args(2)))
	If data_idx > 0 Then
		Return LIndex(data, data_idx)
	EndIf
	
	// 表示用情報を返す
	Switch LCase(Args(2))
	Case "nowdata"
		// 現在表示位置情報を返す
		If LIndex(data, 5) Like "Page*" Then
			Return RoundUp(LIndex(data, 1) / LIndex(data, 3))
		Else
			Return (LIndex(data, 1) & "-" & (LIndex(data, 1) + LIndex(data, 3) - 1))
		EndIf
	Case "maxdata"
		// 最大表示位置情報を返す
		If LIndex(data, 5) Like "Page*" Then
			Return RoundUp(LIndex(data, 4) / LIndex(data, 3))
		Else
			Return LIndex(data, 4)
		EndIf
	Case "scrolldata"
		// ページ情報を返す
		Local num_len = IIf(IsNumeric(Args(3)), Args(3), 1)
		If LIndex(data, 5) Like "Page*" Then
			Local now_page = RoundUp(LIndex(data, 1) / LIndex(data, 3))
			Local max_page = RoundUp(LIndex(data, 4) / LIndex(data, 3))
			Return (RSet(now_page, num_len) & "/" & LSet(max_page, num_len))
		Else
			Local now_page = LIndex(data, 1) & "-" & (LIndex(data, 1) + LIndex(data, 3) - 1)
			Local max_page = LIndex(data, 4)
			Return (RSet(now_page, num_len * 2 + 1) & "/" & max_page)
		EndIf
	Case "isprev"
		// 前の位置が存在するなら1を返す
		If LIndex(data, 5) Like "*B" Then
			Return (LIndex(data, 2) > 1)
		EndIf
		Return (LIndex(data, 1) > 1)
	Case "isnext"
		// 次の位置が存在するなら1を返す
		If LIndex(data, 5) Like "*B" Then
			Return (LIndex(data, 2) > 1)
		EndIf
		Return (LIndex(data, 1) < LIndex(data, 2))
	EndSw
Return ""


//-- ChangeScrollPos id command : 表示位置を変更する --//
DL_ChangeScrollPos:
	Local data = DL_ScrollData[Args(1)]
	If data = "" Then
		Return "NoChange"  // データが存在しない場合は終了する
	EndIf
	
	Local command = LCase(Args(2))
	Local now_pos = LIndex(data, 1)
	
	// 入力モードを処理する
	If command = "input" Then
		Local text = "移動する位置を入力して下さい。;入力可能な範囲　"
		If LIndex(data, 5) Like "Page*" Then
			now_pos = DL_GetScrollData(Args(1), "NowData")
			text = text & "[ 1〜" & DL_GetScrollData(Args(1), "MaxData") & " ]"
		Else
			text = text & "[ 1〜" & DL_GetScrollData(Args(1), "MaxPos") & " ]"
		EndIf
		Input command DL_ReplaceCRLF(text) now_pos
		Wait 0
		If Not IsNumeric(command) Then
			Return "NoChange"
		EndIf
	EndIf
	
	// 表示位置を変更する
	If Left(command, 1) Like "[+-]" Then
		// 表示位置を増減する
		Local pos = Mid(command, 2)
		
		// スクロールタイプに合わせて変更数値を設定する
		If LIndex(data, 5) Like "Page*" Then
			If pos = "p" Then
				pos = LIndex(data, 3)
			Else
				pos = LIndex(data, 3) * pos
			EndIf
		Else
			If pos = "p" Then
				pos = LIndex(data, 3)
			EndIf
		EndIf
		
		// 表示位置を変更する
		If Left(command, 1) = "+" Then
			now_pos = now_pos + pos
		Else
			now_pos = now_pos - pos
		EndIf
	ElseIf command = "max" Then
		// 最大表示位置に設定する
		now_pos = LIndex(data, 2)
	ElseIf IsNumeric(command) Then
		// 指定された表示位置に設定する
		If LIndex(data, 5) Like "Page*" Then
			now_pos = 1 + LIndex(data, 3) * (command - 1)
		Else
			now_pos = command
		EndIf
	Else
		Return "NoChange"  // 対応したコマンド以外なら終了する
	EndIf
	
	// 範囲を超えた値を修正する
	If LIndex(data, 5) Like "*B" Then
		If now_pos < 1 Then
			now_pos = LIndex(data, 2)
		ElseIf now_pos > LIndex(data, 2) Then
			now_pos = 1
		EndIf
	Else
		now_pos = Min(Max(now_pos, 1), LIndex(data, 2))
	EndIf
	
	// 変更後の位置が同じ場合は終了する
	If now_pos = LIndex(data, 1) Then
		Return "NoChange"
	EndIf
	
	//  ページ操作用データを再設定する
	Set DL_ScrollData[Args(1)] (now_pos & Mid(data, InStr(data, " ")))
Return


//-- ScrollFirst(id) : For文用の初期値を返す --//
DL_ScrollFirst:
	Local data = DL_ScrollData[Args(1)]
Return LIndex(data, 1)


//-- ScrollLast(id) : For文用の最終値を返す --//
DL_ScrollLast:
	Local data = DL_ScrollData[Args(1)]
Return Min(LIndex(data, 1) + LIndex(data, 3) - 1, LIndex(data, 4))


